#include "mtlib.c"

unsigned int conexion;

unsigned char centroMensajesDisco;

int main (void) {

	mti_direccion_ipv4 ip;
	unsigned short int puerto;
	unsigned char idDisco;
	mti_mensaje mensaje;
	
	centroMensajesDisco = mtf_obtener_descriptor(1024);

	ip.elem0 = 127;
	ip.elem1 = 0;
	ip.elem2 = 0;
	ip.elem3 = 1;

	printf ("Ingrese ID disco: ");
	scanf("%hhu", &idDisco);
	printf("Ingrese un puerto de conexion: ");
	scanf("%hu", &puerto);

	conexion = mtf_conectar(centroMensajesDisco, MTP_IPV4, (mti_direccion_ipv4) ip, (int) puerto);

	mtf_enviar_handshake(centroMensajesDisco, conexion, 1, &idDisco);

	while (1) {
		
		if (!mtf_recibir_mensajes(centroMensajesDisco)) continue;
		mensaje = mtf_siguiente_mensaje(centroMensajesDisco);
		switch (mensaje.categoria) {

			case MTA_ACEPTAR:
			case MTA_HANDSHAKE:
			break;

			case MTA_CERRAR:
			exit(0);

			case MTA_MENSAJE:
			switch (mensaje.tipo) {
				
				case MTE_NULL:
				mtf_enviar_mensaje(centroMensajesDisco, mensaje.remitente, MTR_NULL);
				break;

				case MTE_LEER_SECTOR:
				{
				long int sector;
				char datos[512];
				mtf_obtener_datos(centroMensajesDisco, mensaje.codigo, &sector);
				mtf_enviar_mensaje(centroMensajesDisco, mensaje.remitente, MTR_DATOS_SECTOR, sector, (void *) datos);
				}
				break;

				case MTE_ESCRIBIR_SECTOR:
				{
				long int sector;
				mtf_obtener_datos(centroMensajesDisco, mensaje.codigo, &sector, NULL);
				mtf_enviar_mensaje(centroMensajesDisco, mensaje.remitente, MTR_ESCRIBIO_SECTOR, sector);		
				}
				break;
				
				case MTE_CANTIDAD_SECTORES:
				mtf_enviar_mensaje(centroMensajesDisco, mensaje.remitente, MTR_CANTIDAD_SECTORES, (long) 100000);			
				break;

				case MTR_NULL:
				case MTQ_MENSAJE_NO_VALIDO:
				break;

				default:
				mtf_enviar_mensaje(centroMensajesDisco, mensaje.remitente, MTQ_MENSAJE_NO_VALIDO);

			}
		}
		mtf_descartar_mensaje(centroMensajesDisco, mensaje.codigo);
	}
	return 0;
}
		

